<?php 
namespace app\admin\controller;

use cmf\controller\AdminBaseController;
use think\Db;
use think\Validate;
use app\admin\model\ContractModel;
use app\admin\model\AccessModel;
use app\admin\model\AdminMenuModel;

/**
* 公司管理
*/
class CompanyController extends AdminBaseController
{

	//公司管理公司列表首页
	public function company_list()
	{
		$data=$this->request->param();
		$where="1=1";
		$k['keyword']="";
		$k['type_id']="";
		//搜索条件
		if(isset($data['keyword']) && !empty(trim($data['keyword']))){
			$where.=" and `company_name` like  '%".$data['keyword']."%'";
			$k['keyword']=$data['keyword'];
		}
		//搜索条件
		if(isset($data['type']) && !empty(trim($data['type']))){
			$where.=" and company_type=".$data['type'];
			$k['type_id']=$data['type'];
		}
		
		$company=get_current_company_info();
		$where.=" and id=".$company['id']." or parent_id=".$company['id'];
		//公司列表
		$list=Db::name('company')->where($where)->order('create_time')->paginate(10);
		//行业列表
		$type=Db::name('company_type')->order('create_time desc')->select();

		//获取权限版本类型
		$access_versions=Db::name('access_versions')->select();

		foreach($list as $key=> $arr){
			//获取行业名称
			foreach($type as $v){
				if($arr['company_type']==$v['id']){
					$arr['company_type']=$v['type_name'];
					$list[$key]=$arr;
				}
			}
			//获取版本名称
			foreach($access_versions as $ac){
				if($arr['versions_type']==$ac['id']){
					$arr['versions_name']=$ac['name'];
					$list[$key]=$arr;
				}
			}
		}	
		$this->assign('k',$k);
		$this->assign('type',$type);
		$this->assign('versions_list',$access_versions);
		$this->assign('list',$list);
		return $this->fetch('index');
	}
	/**
	 * 添加公司账号
	 */
	public function  company_add()
	{		
		$type=Db::name('company_type')->order('create_time desc')->select();
		$this->assign('company_type',$type);
		return $this->fetch('companyaccount');
	}

	/**
	 * 更新授权目录
	 */
	public function  update_path()
	{	
		$param=$this->request->param();
		$id = $param['id'];
		$path = $param['authform']['path'];
		$up['path'] = implode(',',$path);
		db('company')->where("id",$id)->update($up);
 
		return json(['status'=>'success','message'=>'更新成功！']);
		 
	}
	public function  get_auth()
	{	
		$param=$this->request->param();
		$id = $param['id'];
		$info = db('company')->where("id",$id)->find();
		if ($info['path']) {
			$info['path'] = explode(',',$info['path']);
		} else {
			$info['path'] = [];
		}
 
		return json(['status'=>'success','message'=>'获取成功！','data'=>$info]);
		 
	}
	/**
	 * 	公司账号提交
	 * @return [type] [description]
	 */
	public function  companyAddPost()
	{
		if(!$this->request->isPost())
        {
            $this->error('请求类型错误！');
        }

        $data=$this->request->param();
        //去空
        foreach ($data as $key => $value) {
            $value=trim($value);
            $data[$key]=$value;
        }

        //  数据验证
        $rule=[
            'company_name'=>"require|max:200",
            'company_num'=>"require|max:50",
            'company_type'=>"require",
            'username'=>"require|max:50",
            'password'=>"require|max:50|min:6",
            'mobile'=>"require",
            'email'=>"require|email",
            'captcha'=>"require"
        ];
        $msg=[
            'company_name.require'=>'公司名称不能为空',
            'company_name.max'=>'公司名称不能超过200个字符',
            'company_num.require'=>'公司组织代码不能为空',
            'company_type.require'=>'请选择所属行业',
            'company_num.max'=>'公司组织代码不能超过50个字符',
            'username.require'=>'用户名称不能为空',
            'username.max'=>'用户名不能超过20个字符',
            'password.require'=>'密码不能为空',
            'password.max'=>'密码不能超过20个字符',
            'mobile.require'=>'手机号码不能为空',
            'email.require'=>'邮箱不能为空',
            'email.email'=>'邮箱格式不正确',
            'captcha.require'=>'验证码不能为空'
        ];
        $validate =new Validate($rule,$msg);
        if(!$validate->check($data)){
            $this->error($validate->getError());
        }
        //验证手机号
        $rule = '/^0?(13|14|15|17|18|19)[0-9]{9}$/';
        $result = preg_match($rule, $data['mobile']);
        if (!$result) {
            $this->error('请填写11位正确的手机号！');
        }

        //验证码
        if (!cmf_captcha_check($data['captcha'])) {
            $this->error(lang('CAPTCHA_NOT_RIGHT'));
        }

        //启用事务
        Db::startTrans();
        try {
                //公司表加入数据  
                $company['company_name']=$data['company_name'];
                $company['company_num']=$data['company_num'];
                $company['company_type']=$data['company_type'];
                $company['address']=$data['address'];
                $company['tel']=$data['tel'];
                $company['url']=$data['url'];
                $company['frame_type']=$data['frame_type'];
                $company['parent_id']=8;
                $company['create_time']=time();
                $company['period']=$company['create_time']+(86400*365);
                $company['status']=2;//审核中

                $company_id=Db::name('company')->insertGetId($company);
                Db::name('company')->where('id',$company_id)->update(['aid'=>'==='.md5(md5($company_id.$company['create_time']))]);

                //创建基础部门
                //$department['department_NO']=10;
                $department['status']=1;
                $department['parent_id']=0;
                $department['name']="办公室";
                $department['remark']=$company['company_name'];
                $department['company_id']=$company_id;

                $department_id=Db::name('department')->insertGetId($department);

                //创建基础角色      
                $role['parent_id']=1;
                $role['department_id']=$department_id;
                $role['status']=1;
                $role['create_time']=time();
                $role['name']=$company['company_name']."(CEO)";
                $role['remark']=$company['company_name']." 公司帐号";
                $role['company_id']=$company_id;

                $role_id=Db::name('role')->insertGetId($role);
                
                //创建管理员
                $user['user_type']=1;
                $user['create_time']=time();
                $user['user_status']=2;//审核中
                $user['user_login']=$data['username'];
                if($company['frame_type']==0){
					$user['user_pass']=cmf_password($data['password']);
                }else{
                	$code=$this->create_randomstr();
                	$user['user_pass']=$this->password($data['password'],$code).'+'.$code;
                }
                $user['mobile']=$data['mobile'];
                $user_id=Db::name('user')->insertGetId($user);

                //将用户关联到 公司 部门   角色 
                $ins['user_id']=$user_id;
                $ins['company_id']=$company_id;
                $ins['department_id']=$department_id;
                $ins['role_id']=$role_id;
                Db::name('user_attach')->insert($ins);
                //提交事务
                Db::commit();
        } catch (Exception $e) {
            //回滚事务
            Db::rollback();        
            $this->error('添加失败，请稍后再试!');    
        }
        $this->success('添加成功！',url('company/company_list'));
	}


	/**
	* 生成随机字符串
	* @param string $lenth 长度
	* @return string 字符串
	*/
	private function create_randomstr($lenth = 6) {
		return $this->random($lenth, '123456789abcdefghijklmnpqrstuvwxyzABCDEFGHIJKLMNPQRSTUVWXYZ');
	}
	/**
	* 对用户的密码进行加密
	* @param $password
	* @param $encrypt //传入加密串，在修改密码时做认证
	* @return array/password
	*/
	private function password($password, $encrypt='') {
		$pwd = array();
		$pwd['encrypt'] = $encrypt ? $encrypt : create_randomstr();
		$pwd['password'] = md5(md5(trim($password)).$pwd['encrypt']);
		return $encrypt ? $pwd['password'] : $pwd;
	}

	/**
	* 产生随机字符串
	*
	* @param    int        $length  输出长度
	* @param    string     $chars   可选的 ，默认为 0123456789
	* @return   string     字符串
	*/
	private function random($length, $chars = '0123456789') {
		$hash = '';
		$max = strlen($chars) - 1;
		mt_srand();
		for($i = 0; $i < $length; $i++) {
			$hash .= $chars[mt_rand(0, $max)];
		}
		return $hash;
	}

	/**
	 * 获取用户信息
	 */
	public function getAccount($id){
		$company=Db::name('company')->where('id',$id)->find();
		$attach=Db::name('user_attach')->where('company_id',$id)->find();
		$user=Db::name('user')->where('id',$attach['user_id'])->find();
		$str ='companyId='.$company['id'].'&userId='.$user['id'].'&userName='.$user['user_login'].'&pwd='.$user['user_pass'];
		return $str;
	}

	/**
	 * 行业分类
	 * @return [type] [description]
	 */
	public function type()
	{
		$type=Db::name('company_type')->order('create_time desc')->select();

		$this->assign('list',$type);
		return $this->fetch();
	}

	/**
	 * 行业类型添加
	 */
	public function add_type()
	{
		if(!$this->request->isPost()){
			$this->error('访问类型错误！');
		}

		$data=$this->request->param();

		//验证数据
		$validate = new Validate(['type_name'  => 'require|max:250'],['type_name.require'=>'类型名称不能为空','type_name.max'=>'类型名称长度不能超过250个']);
		if (!$validate->check($data)) {
		    $this->error($validate->getError(),url('company/type'),'',1);
		}

		$data['create_time']=time();


		$res=Db::name('company_type')->insert($data);
		if($res){
			$this->success('添加成功！',url('company/type'),'',1);
		}else{
			$this->error('添加失败，请稍后再试！',url('company/type'),'',1);
		}
	}

	/**
	 * 修改状态
	 */
	public function modifyStatus()
	{
		if(!$this->request->isPost()){
			$this->error('请类型错误！');
		}
		$status=$this->request->param()['status'];
		$id=$this->request->param()['id'];
		$res=Db::name('company')->where('id',$id)->update(['status'=>$status]);
		//如果是停用/开启  更新该公司所有用户状态
		if($status==0 || $status==1){
			$company_user=Db::name('company_user')->where('')->column('user_id');
			Db::name('user')->where('id','in',$company_user)->update(['user_status'=>$status]);
		}
		if($res){
			$this->success('修改状态成功！');
		}else{
			$this->error('修改状态失败！');
		}
	}

	/**
	 * 编辑行业类型
	 */
	public function edit_type()
	{
		if(!$this->request->isPost()){
			$this->error('访问类型错误！');
		}
		$data=$this->request->param();
		//验证数据
		$validate = new Validate(['type_name'  => 'require|max:250'],['type_name.require'=>'类型名称不能为空','type_name.max'=>'类型名称长度不能超过250个']);
		if (!$validate->check($data)) {
		    $this->error($validate->getError(),url('company/type'),'',1);
		}
		$res=Db::name('company_type')->where('id',$data['id'])->update(['type_name'=>$data['type_name']]);
		if($res){
			$this->success('修改成功！',url('company/type'),'',1);
		}else{
			$this->error('修改失败，请稍后再试！',url('company/type'),'',1);
		}

	}

	/**
	 * 删除行业类型
	 * @return [type] [description]
	 */
	public function del_type()
	{
		$data=$this->request->param();
		$res=Db::name('company')->where('company_type',$data['id'])->select();
		if(!empty($res)){
			$this->error('删除失败！当前类型被引用了'.count($res).'次无法进行删除操作！',url('company/type'),'',1);
		}
		$res=Db::name('company_type')->where('id',$data['id'])->delete();
		if($res){
			$this->success('删除成功！',url('company/type'),'',1);
		}else{
			$this->error('删除失败，请稍后再试！',url('company/type'),'',1);
		}
	}

	/**
	 * 公司列表手动更改权限版本方法
	 * @return [type] [description]
	 */
	public function ajax_change_access()
	{
		if(!$this->request->isAjax()){
			return json(['status'=>'error','message'=>'请求类型错误！']);
		}
		$type=$this->request->param()['type'];
		$id=$this->request->param()['id'];
		//写入数据库
		Db::name('company')->where('id',$id)->update(['versions_type'=>$type]);
		//删除之前的授权菜单
		Db::name('auth_access')->where('company',$id)->delete();
		//获取当前新版本的菜单数据 从新授权ceo
		$versionsMenu=Db::name('access_versions_menu')->where('access_versions_id',$type)->select();
		if(!empty($versionsMenu)){
			return json(['status'=>'success','message'=>'版本更新成功，但是未获取到版本菜单数据，请检查版本是否授权了菜单信息！']);
		}
		//更新公司最高角色ceo授权菜单
		$accessModel=new AccessModel();
		$res=$accessModel->update_ceo_menu($id,$versionsMenu,$type);
		if($res){
			return json(['status'=>'success','message'=>'版本更新成功！']);
		}else{
			return json(['status'=>'error','message'=>'保存失败，请稍后再试！']) ;
		}
	}
	
/****************************************************************************************/
//公司权限管理功能
/****************************************************************************************/
	/**
	 * 权限版本管理页面
	 * @return [type] [description]
	 */
	public function versions()
	{
		if($this->request->isPost()){
			$data=$this->request->param();
		}else{
			//获取版本列表
			$list=Db::name('access_versions')->order('create_time desc')->select();
			//获取所有菜单
	        $adminMenuModel = new AdminMenuModel();
			
	        $allMenu = $adminMenuModel->menuCache();
			
	        //获取当前编辑的公司模块菜单 过滤掉其他公司的模块菜单
          	$moduleMenu=Db::name('module_menu')->where( 'company_id' ,  8 )->column('menu_id');
			//dump( $moduleMenu );exit;
        	$moduleMenu=array_unique($moduleMenu);
			
			//读取模块菜单中的子菜单
			
			$subModuleMenus = $this->getSubModuleMenu( $moduleMenu );
			$moduleMenu = array_merge( $subModuleMenus , $moduleMenu);
			//dump( $moduleMenu );exit;
        	foreach ($allMenu as $key => $value) {
        		//系统2.0版本开始，所有主系统安装的模块菜单会放入到模块菜单中，选择登入主系统的子账号菜单版本的时候可以选择主系统模块菜单
        		$appArr = explode( '/', $value['app'] );
        		if( count($appArr) == 2 ){
        			if( !in_array($value['id'],$moduleMenu)){
	        			unset($allMenu[$key]);
	        		}
        		}
        	}

	        //树形构建
	        $allMenu=$this->get_hierarchy($allMenu,0);
			$this->assign('da',json_encode($allMenu));

			$this->assign('list',$list);
			return $this->fetch();
		}
	}
	
	//获取模块菜单子菜单
	private function getSubModuleMenu( $moduleMenu = [] )
	{
	
		$allSub = [];
		foreach( $moduleMenu as $key => $menuId ){
			$rid = $this->searchModuleMenu( $menuId);
			$allSub = array_merge( $allSub , $rid );
		}
		return $allSub;
	}
	
	//查询模块菜单
	private function searchModuleMenu( $menuId )
	{
		$returnMenuIds = [];
		$ids  = Db::name( 'admin_menu' )->where( 'parent_id' , $menuId )->column( 'id' );
		if( !empty ( $ids ) ){
			$returnMenuIds = $ids;
			foreach( $ids as $key => $id ){
				$rid = $this->searchModuleMenu ( $id );
				$returnMenuIds =  array_merge( $returnMenuIds ,  $rid );
			}
		}else{
			return [];
		}
		return $returnMenuIds;		
	}

/**
 * 公司申请列表 
 * 2019222
 * @return [type] [description]
 */
	public function apply_list()
	{
		$applyList=Db::view('company','*')->view('company_type','type_name','company_type.id=company.company_type')->where('status','in',[2,3])->order('status,create_time desc')->select();
		$this->assign('applylist',$applyList);
		return $this->fetch();
	}
	/**
	 * 公司申请详情页面
	 * @return [type] [description]
	 */
	public function apply_particulars()
	{
		$id=$this->request->param('id');
		if(empty($id)){
			$this->error('请求错误！');
		}
		//获取公司信息
		$company=Db::view('company','*')->view('company_type','type_name','company_type.id=company.company_type')->where('company.id',$id)->find();
		//获取申请的管理员信息
		$user=Db::view('user',"*")->view('company_user','*','company_user.user_id=user.id')->where('company_user.company_id',$id)->find();
		$this->assign('company',$company);
		$this->assign('user',$user);
		return $this->fetch();
	}
	/**
	 * 申请处理
	 * @return [type] [description]
	 */
	public function apply_deal()
	{
		if(!$this->request->isPost()){
			return json(['status'=>'error','message'=>'请求类型错误！']);
		}
		$data=$this->request->param();
		//驳回请求
		$data['remark']=$data['remark']." 处理时间：".date('Y年m月d日 H时i分s秒',time());
		$res=Db::name('company')->where('id',$data['id'])->update($data);
		//更新用户账户的状态
		$userIds=Db::name('user_attach')->where('company_id',$data['id'])->column('user_id');
		Db::name('user')->where('id','in',$userIds)->update(['user_status'=>$data['status']]);
		if($res){
			return json(['status'=>'success','message'=>'提交成功！']);
		}else{
			return json(['status'=>'error','message'=>'提交失败，请稍后再试！']);
		}
	}
	/**
	 * 权限版本添加页面
	 * @return [type] [description]
	 */
	public  function versions_add()
	{
		if($this->request->isPost()){
			$data=$this->request->param();
			$rule=[
				'name'=>'require|max:200',
				'price'=>'require'
			];
			$msg=[
				'name.require'=>'版本名称不能为空',
				'name.max'=>'版本名称不能超过200个字符',
				'price.require'=>'价格不能为空'
			];
			foreach ($data as $key => $value) {
				$data[$key]=trim($value);
			}
			$validate= new Validate($rule,$msg);
			//数据验证
			if(!$validate->check($data)){
				$this->error($validate->getError());
			}
			//存入数据库
			if(isset($data['edit'])){//更新
				unset($data['edit']);
				$res=Db::name('access_versions')->where('id',$data['id'])->update($data);
				$msg=$res?"更新成功!":"更新失败";
			}else{//添加
				$data['create_time']=time();
				$res=Db::name('access_versions')->insert($data);
				$msg=$res?"新增成功!":"新增失败";
			}
			if($res){
				$this->success($msg,url('company/versions'));
			}else{
				$this->error($msg.'，请检查或稍后再试！');
			}
		}else{
			$data=$this->request->param();
			$action=null;
			if(isset($data['id'])){//修改
				$action='edit';
				$v=Db::name('access_versions')->where('id',$data['id'])->find();
				$this->assign('data',$v);
			}
			$this->assign('action',$action);
			return $this->fetch();
		}
	}

	/**
	 * 权限版本删除
	 */
	public function versions_del()
	{
		$id=$this->request->param('id');
		//查询是否有被引用，否则不能删除
		//待实现
		//删除授权菜单表中的数据
		$res=$this->clear_access_menu($id);
		if($res){
			$res=Db::name('access_versions')->where('id',$id)->delete();
		}
		if($res){
			$this->success('删除成功！');
		}else{
			$this->error('删除失败，请稍后再试！');
		}
	}

	/**
	 * 获取版本被授权的菜单  返回授权菜单id数组
	 * @return [type] [description]
	 */
	public function ajax_get_access_menu()
	{
		if(!$this->request->isAjax()){
			return json(['status'=>'error','message'=>'请求类型错误！']);
		}
		$id=$this->request->param()['id'];
		//获取所有菜单
        $adminMenuModel = new AdminMenuModel();
        $allMenu= $adminMenuModel->menuCache();

        //获取请求版本的授权菜单
        $accessMenu=Db::name('access_versions_menu')->where('access_versions_id',$id)->column('rule_name');
        //检查选中的项
        foreach ($allMenu as $key => $value) {
        		$app=$value['app'];
	        	$controller=$value['controller'];
	        	$action=$value['action'];
	        	$x="$app/$controller/$action";
	        	if(in_array($x,$accessMenu)){//筛选已有的版本菜单
	        		$ids[]=$value['id'];
	        	}
        }
        return $ids;
	}

	/**
	 * 构建树形菜单必须数据 配合zy_treeview.js插件使用
	 * 必要的返回字段说明 :
	 * 	text  string 显示的文本
	 * 	id  int  栏目的id
	 * 	parent int 栏目的父级id
	 * 	checked bool 是否被选中  用于带复选框的树形菜单使用，不使用可忽略
	 * 	nodes  array 子级栏目
	 * @param  array  $data 带有分级的源数据
	 * @param  int $id 定义一级栏目的id  默认0 常用parent_id
	 * @param  int  $depth 遍历深度，需要提取菜单级数  默认无限极提取
	 * @param  int $level  保存栏目的当前层级深度 默认0  无需传入
	 * @return array  返回带层级的栏目数据  配合插件可之间生成树形菜单
	 * 
	 */
	public function get_hierarchy($data,$id,$depth=null,$level=0)
	{
		$list=[];
		//栏目深度 null,0 无限级栏目  
		$flag=empty($depth)?true:($depth>$level);
		foreach ($data as $key => $value) {
			if($value['parent_id']==$id && $flag){
				$arr['text']=$value['name'];
				$arr['level']=$level;
				$arr['checked']=isset($value['checked'])?$value['checked']:false;
				$arr['id']=$value['id'];
				$arr['parent_id']=$value['parent_id'];
				$arr['nodes']=$this->get_hierarchy($data,$value['id'],$depth,$level+1);
				if(empty($arr['nodes'])){unset($arr['nodes']);}
				$list[]=$arr;
			}
		}
		return $list;
	}

	/**
	 * ajax权限菜单添加
	 * @return json status操作状态 success  error
	 *  @return json message 提示信息
	 */
	public function ajax_menu_add()
	{
		if(!$this->request->isAjax()){
			return json(['status'=>'error','message'=>'请求类型错误！']);
		}
		$data=$this->request->param();
		if(!isset($data['list'])){
			//清空菜单
			Db::name('access_versions_menu')->where('access_versions_id',$data['id'])->delete();
			//与此版本相关的授权信息都要清空
			Db::name('auth_access')->where('access_versions_id',$data['id'])->delete();
			return json(['status'=>'success','message'=>'授权菜单已清空！']);
		}
		//版本id
		$versions_id=$data['id'];
		//获取缓存菜单
		$adminMenuModel = new AdminMenuModel();
        $result = $adminMenuModel->menuCache();
        //提取选中的菜单
        $newMenu=[];
        $menuData=[];
        foreach ($result as $key => $value) {
        	foreach ($data['list'] as $index => $num) {
        		if($num==$value['id']){
        			$app=$value['app'];
        			$controller=$value['controller'];
        			$action=$value['action']; 
        			 //所需字段  access_versions_id版本id   rule_name菜单url  type 默认值 admin_url  create_time创建时间
        			 $insert['menu_id']=$value['id'];//菜单id 2019326
        			$insert['rule_name']="$app/$controller/$action";
        			$insert['create_time']=time();
			        $insert['access_versions_id']=$versions_id;
			        $insert['type']='admin_url';
			        $newInsert['rule_name']="$app/$controller/$action";
			        $newInsert['type']='admin_url';
			        $menuData[]=$newInsert;
        			$newMenu[]=$insert;
        		}
        	}
        }
        //处理提取出来的菜单并添加到数据库cmf_access_versions_menu  
      	//存入新数据之前，先清除之前的数据
      	// 启动事务
      	// 数据准备
			$oldMenu=Db::name('access_versions_menu')->where('access_versions_id',$versions_id)->select();
			$oldMenu=json_decode($oldMenu,true);
			$res=$this->updateAccessMenu($oldMenu,$newMenu);//更新菜单
		
			//改用更新//$this->clear_access_menu($versions_id);
			//获取旧的授权菜单列表   (当前版本的所有菜单id)
			if(!empty($res['delete'])){//删除的
				$result=Db::table('cmf_access_versions_menu')->where('access_versions_id',$versions_id)->where('id','IN',$res['delete']['id'])->delete();
			}
			if(!empty($res['insert'])){//新增的
				$result=Db::table('cmf_access_versions_menu')->insertAll($res['insert']);
			}
			//更新相应的角色授权数据 auth_access表
			$this->updateAuthAccess($versions_id,$res);
			if($result){
				return json(['status'=>'success','message'=>'版本授权信息保存成功！']);
			}else{
				return json(['status'=>'error','message'=>'版本授权信息保存失败，请稍后再试！']);
			}

		//保存数据

	}
	/**
	 * 更新用户的角色授权表信息2019326
	 */
	public function updateAuthAccess($versions_id,$data)
	{	//操作auth_access表中的数据
		if(!empty($data['delete'])){
			//删除的全部删除，删除条件menu_id  和版本号
			Db::name('auth_access')->where('access_versions_id',$versions_id)->where('menu_id','IN',$data['delete']['menu_id'])->delete();
		}
		if(!empty($data['insert'])){
			//为此版本下的所有公司最高角色添加授权信息
        	//获取所有使用此版本的公司id  去更新auth_access表中该公司最高权限的id
        	$companyIds=Db::name('company')->where('versions_type',$versions_id)->column('id');
      
        	$accessModel=new AccessModel();
        	foreach ($companyIds as $key => $value) {
        		$accessModel->update_ceo_menu($value,$data['insert'],$versions_id);
        	}
		}
	}

	/**
	 * 更新权限菜单2019326
	 * @param $versionsId int  版本id
	 * @param $newMenu [] 新菜单
	 */
	public function updateAccessMenu($oldMenu,$newMenu){
		$delete=[];//多余数据
		$insert=[];//新数据
		//数据比对
		//比对逻辑  遍历新菜单  二重循环遍历旧菜单   
		//判断方法  新菜单menu_id  与  旧菜单menu_id一一比对，如果不存在就是要新增的，反向遍历删除多余的
		foreach ($newMenu as $key => $value) {
			$isInsert=true;
			foreach ($oldMenu as $ok => $ov) {
				if($value['menu_id']==$ov['menu_id']){
					$isInsert=false;
				}
			}
			if($isInsert){//保存要新增的数据
				$insert[]=$value;
			}
		}
		//找到要删除的数据
		foreach ($oldMenu as $key => $value) {
			$isDelete=true;
			foreach ($newMenu as $nk => $nv) {
				if($value['menu_id']==$nv['menu_id']){
					$isDelete=false;
				}
			}
			//保存要删除的数据
			if($isDelete){
				$delete['id'][]=$value['id'];
				$delete['menu_id'][]=$value['menu_id'];
			}
		}
		return ['delete'=>$delete,'insert'=>$insert];
	}
	/**
	 * 清除版本授权菜单
	 * @param  版本id
	 * @return true   false
	 */
	public function clear_access_menu($id)
	{
		Db::name('access_versions_menu')->where('access_versions_id',$id)->delete();
		Db::name('auth_access')->where('access_versions_id',$id)->delete();
		return true;
	}	
	/**
	 *更新到期时间
	 */
	public function modifyPeriod(){
		if($this->request->isAjax()){
			$data=$this->request->param();
			$res=Db::name('company')->where('id',$data['id'])->update(['period'=>strtotime($data['period'])]);
			if($res){
				return zy_json(true,'到期时间更新成功！');
			}else{
				return zy_json(false,'到期时间更新失败，请稍后再试！');
			}
		}
	}

	/**
	 * 账户激活状态 重置
	 */
	public function resetActive()
	{
		$data = $this->request->param();
		$res = Db::name('company')->where('id',$data['id'])->update(['active'=>0]);
		if(!$res){
			$this->error('重置激活失败，请稍后再试！');
		}
		$this->success('重置激活成功！');
	}

	/**
	 * 设置公司菜单别名
	 */
	public function setMenuAlias()
	{
		$data = $this->request->param();
		$companyId = (isset($data['companyId']) && !empty($data['companyId']) )?$data['companyId']:8;// $data['companyId'];

		$accessModel = new AccessModel();

		//1获取公司最高角色
		$heightRoleInfo = $accessModel->get_company_highest_role_info($companyId);
		$heightRoleId = $heightRoleInfo['id'];
		//2获取公司最高角色菜单
		//$roleMenu = $accessModel->get_menu($heightRoleId);
		$roleMenuIds = Db::name('auth_access')->where('company',$companyId)->column('menu_id');
		//3读取公司模块菜单
		$moduleMenuIds = Db::name('module_menu')->where('company_id',$companyId)->column('menu_id');
		//合并最高角色菜单  和 模块菜单
		$allMenuIds = array_unique( array_merge($roleMenuIds, $moduleMenuIds) );

		//读取原始菜单 和 别名
		$menuList = Db::name('admin_menu')->where('id','IN',$allMenuIds)->select()->toArray();
		$aliasList = Db::name('menu_alias')->where('company_id',$companyId)->select()->toArray();
		foreach ($menuList as $key => $value) {
			$alias = '';
			foreach ($aliasList as $arr) {
				if($value['id'] == $arr['menu_id']){
					$alias = $arr['alias'];
					break;
				}
			}
			$menuList[$key] ['alias'] = $alias;
		}

		//获取公司列表
		$companyList = Db::name('company')->where('frame_type',0)->select()->toArray();

		$this->assign('companyId',$companyId);
		$this->assign('companyList',$companyList);
		$this->assign('menuList',$menuList);
		return $this-> fetch('set_menu_alias');
	}
	/**
	 * 修改公司菜单别名
	 */
	public function editMenuAlias()
	{
		$data = $this->request->param();
		$menuid = $data['id'];
		$companyId = $data['companyId'];
		$alias = $data['type'];

		$find = Db::name('menu_alias')->where('menu_id',$menuid)->where('company_id',$companyId)->find();
		if(empty($find)){
			//添加
			$res = Db::name('menu_alias')->insertGetId(['alias'=>$alias,'menu_id'=>$menuid,'company_id'=>$companyId]);
		}else{
			//更新
			if(empty($alias)){
				//如果为空就删除
				$res = Db::name('menu_alias')->where('menu_id',$menuid)->where('company_id',$companyId)->delete();
			}else{
				$res = Db::name('menu_alias')->where('menu_id',$menuid)->where('company_id',$companyId)->update(['alias'=>$alias]);
			}
		}		

		if(!$res){
			return zy_json(false,'修改失败,稍后再试！');
		}
		return zy_json(true,'修改成功！');
	}

	/**
	 *获取公司密匙
	 */
	public function getMishi( )
	{
		if( !$this->request->isPost() ) return zy_json_echo( false , '请求类型错误！' );
		$data = $this->request->param();
		$id = $data ['id'];
		$code = Db::name( 'company' )->where( 'id' , $id )->value( 'code' );
		$code = json_decode( $code );
		if( empty($code) ){
			$code = [
				'server_gy' => '',
				'server_sy' => '',
				'client_gy' => '',
				'client_sy' => '',
			];
		}
		return zy_json_echo(true,'',$code);
	}
	/**
	 * 保存秘钥
	 */
	public function saveMishi()
	{
		if( !$this->request->isPost() ) return zy_json_echo( false , '请求类型错误！' );
		$data = $this->request->param();
		$id = $data ['id'];
		$data = $data ['data'];
		$res = Db::name( 'company' )->where( 'id', $id)->update( [ 'code' => json_encode($data) ] );
		if( !$res ){
			return zy_json_echo( false , '数据保存失败,请稍后再试!' );
		}
		return zy_json_echo( true , '数据保存成功!' );
	}
	
	
	//删除公司信息
	public function deleteCompanyInfo($id)
	{
		$cid = $id ;
		Db::startTrans();
        try{
			
			//删除菜单 cmf_auth_access   cmf_module_menu
			Db::table( 'cmf_auth_access' )->where( 'company' , $cid )->delete();
			Db::table( 'cmf_module_menu' )->where( 'company_id' , $cid )->delete();
			//菜单别名
			Db::table('cmf_menu_alias')->where('company_id',$cid)->delete();
			
			//删除角色
			Db::table('cmf_role')->where('company_id',$cid)->delete();
			//删除部门
			Db::table('cmf_department')->where('company_id',$cid)->delete();
			//删除用户
			$userId = Db::table('cmf_user_attach')->where('company_id',$cid)->column('user_id');
			Db::table('cmf_user')->where('id', 'IN',$userId )->delete();
			Db::table('cmf_user_attach')->where('company_id',$cid)->delete();
			//删除公司信息
			Db::table('cmf_company')->where('id',$cid)->delete();
			
			//删除公司模块购买记录
			Db::table('cmf_module_purchase_history')->where('company_id', $cid)->delete();
			
            // 提交事务
            Db::commit();
        } catch (\Exception $e) {			 
            // 回滚事务	
            Db::rollback();
            //注意：我们做了回滚处理，所以id为1039的数据还在 
			if(APP_DEBUG){
				$this->error('公司信息删除失败，请稍候再试！'.$e->getMessage());
			}
			$this->error('公司信息删除失败，请稍候再试！');
        }
		$this->success('公司信息删除成功！');
	}
	









/****************************************************************************************/
//公司权限管理功能结束
/****************************************************************************************/

public function insert()
{
	echo '手动更新数据专用：';
/*	//更新 user到company_user





	$user=Db::name('user')->where('user_type',1)->order('id')->select();
	$data=[];
	foreach ($user as $key => $value) {
		$data[$key]['user_id']=$value['id'];
		$data[$key]['company_id']=8;
	}
	$res=Db::name('user_attach')->insertAll($data);
	dump($res);*/
}



/*****类结束******/
}